home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Python 1.3 / Python 1.3 PPC / Lib / mac / macostools.py < prev    next >
Encoding:
Python Source  |  1995-10-11  |  2.2 KB  |  91 lines  |  [TEXT/PYTH]

  1. """macostools - Various utility functions for MacOS.
  2.  
  3. mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src'
  4. copy(src, dst) - Full copy of 'src' to 'dst'
  5. """
  6.  
  7. import macfs
  8. import Res
  9. import os
  10. from MACFS import *
  11.  
  12. Error = 'macostools.Error'
  13.  
  14. FSSpecType = type(macfs.FSSpec(':'))
  15.  
  16. BUFSIZ=0x100000        # Copy in 1Mb chunks
  17.  
  18. #
  19. # Not guaranteed to be correct or stay correct (Apple doesn't tell you
  20. # how to do this), but it seems to work.
  21. #
  22. def mkalias(src, dst):
  23.     """Create a finder alias"""
  24.     srcfss = macfs.FSSpec(src)
  25.     dstfss = macfs.FSSpec(dst)
  26.     alias = srcfss.NewAlias()
  27.     srcfinfo = srcfss.GetFInfo()
  28.  
  29.     Res.FSpCreateResFile(dstfss, srcfinfo.Creator, srcfinfo.Type, -1)
  30.     h = Res.FSpOpenResFile(dstfss, 3)
  31.     resource = Res.Resource(alias.data)
  32.     resource.AddResource('alis', 0, '')
  33.     Res.CloseResFile(h)
  34.     
  35.     dstfinfo = dstfss.GetFInfo()
  36.     dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag
  37.     dstfss.SetFInfo(dstfinfo)
  38.     
  39. def mkdirs(dst):
  40.     """Make directories leading to 'dst' if they don't exist yet"""
  41.     if dst == '' or os.path.exists(dst):
  42.         return
  43.     head, tail = os.path.split(dst)
  44.     print 'XX', dst, '->', (head, tail)
  45.     # XXXX Is this a bug in os.path.split?
  46.     if not ':' in head:
  47.         head = head + ':'
  48.     mkdirs(head)
  49.     os.mkdir(dst, 0777)
  50.     
  51. def copy(src, dst, createpath=0):
  52.     """Copy a file, including finder info, resource fork, etc"""
  53.     if createpath:
  54.         mkdirs(os.path.split(dst)[0])
  55.     srcfss = macfs.FSSpec(src)
  56.     dstfss = macfs.FSSpec(dst)
  57.     
  58.     ifp = open(srcfss.as_pathname(), 'rb')
  59.     ofp = open(dstfss.as_pathname(), 'wb')
  60.     d = ifp.read(BUFSIZ)
  61.     while d:
  62.         ofp.write(d)
  63.         d = ifp.read(BUFSIZ)
  64.     ifp.close()
  65.     ofp.close()
  66.     
  67.     ifp = open(srcfss.as_pathname(), '*rb')
  68.     ofp = open(dstfss.as_pathname(), '*wb')
  69.     d = ifp.read(BUFSIZ)
  70.     while d:
  71.         ofp.write(d)
  72.         d = ifp.read(BUFSIZ)
  73.     ifp.close()
  74.     ofp.close()
  75.     
  76.     sf = srcfss.GetFInfo()
  77.     df = dstfss.GetFInfo()
  78.     df.Creator, df.Type = sf.Creator, sf.Type
  79.     df.Flags = (sf.Flags & (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias))
  80.     dstfss.SetFInfo(df)
  81.     
  82. def copytree(src, dst):
  83.     """Copy a complete file tree to a new destination"""
  84.     if os.path.isdir(src):
  85.         mkdirs(dst)
  86.         files = os.listdir(src)
  87.         for f in files:
  88.             copytree(os.path.join(src, f), os.path.join(dst, f))
  89.     else:
  90.         copy(src, dst, 1)
  91.